Back
Backend Engineering

Private Learn

Private Learn architecture diagram

Summary

(5 min read)

Private Learn is an online learning platform built with Python + Frappe. It helps instructors upload and manage courses, reach learners, and monetize content. The backend supports course/catalog management, interaction (forums + messaging), and extensible flows for certificates and progress tracking.

Project Snapshot

My Role

Backend Developer

Duration

Oct 2025

Context

EdTech Platform

Outcome

Course publishing backend · discussion + messaging foundations · scalable content workflows

Stack

PythonFrappe FrameworkMariaDBRedisNginxLinux

The Problem

Context

Tutors and instructors need a simple way to publish learning content, engage learners, and earn from their expertise — without wrestling with complex tooling.

The Pain

Without solid backend workflows (uploading content, organizing lessons, managing users, and handling interaction), learning platforms become hard to operate and frustrating for creators and learners.

Why It Mattered

Creators need a reliable platform to manage content and engagement. Learners need a smooth experience that supports interaction and progression.

Goals & Requirements

Technical Goals

  • Backend-first architecture for course publishing and content management
  • Structured data model for courses, lessons, enrollments, and progress
  • Interaction layer: discussions/forums + direct messaging
  • Extensible flows for certificates/badges and professional programs
  • Webhook-ready integrations for notifications and external services

Constraints

  • Keep the system easy to manage for non-technical course creators
  • Design workflows that can scale as the catalog and userbase grows

Architecture Design

A Python + Frappe backend (monolith) with modular DocTypes and server-side logic for courses, learning flows, user interaction, and operational tooling. Redis supports caching/background tasks, with MariaDB as the primary datastore.

Architecture Diagram

Scroll horizontally on smaller screens to view full diagram

Component Breakdown

Frappe App

Core backend: APIs, workflows, permissions, and admin tooling.

Course + Catalog Module

Courses, lessons, uploads, categories, and publishing workflow.

Learning + Progress

Enrollments, lesson completion, and progress tracking.

Interaction

Forums/discussions, Q&A, and direct messaging.

Certificates

Completion certificates and achievement badges (extensible).

MariaDB

Primary relational datastore.

Redis

Caching and background task support.

Nginx

Web server/reverse proxy for production.

Key Design Decisions

Use Frappe for rapid backend workflows

Frappe provides fast iteration with strong data modeling (DocTypes), permissions, and admin UX — ideal for content-heavy platforms.

Design modules around learning domain

Separating course/catalog, progress, and interaction keeps the system maintainable as features grow (Udemy-style evolution).

Implementation Breakdown

01

Domain modeling in Frappe

Built the platform around clear DocTypes and workflows for course publishing and learner progression.

  • Course → lessons/modules structure
  • Enrollment + progress tracking
  • Permissions for creators vs learners
02

Interaction features

Designed interaction primitives (forums and messaging) to support Q&A and community learning.

  • Discussion threads per course/lesson
  • Direct messaging between learners and instructors
  • Webhook-friendly messaging for notifications
03

Backend architecture (Udemy-inspired)

A scalable backend layout that can evolve from a monolith into dedicated services as traffic grows.

  • Backend-first separation of concerns by domain modules
  • Clear boundaries for notifications, search, and media storage
High-level backend architecturemermaid
Rendering diagram…
View diagram source
flowchart LR
  U["Learner / Creator"] --> WEB["Web UI"]
  WEB --> API["Frappe Backend"]

  subgraph Domain["Core Modules"]
    COURSES["Courses & Catalog"]
    LEARN["Enrollments & Progress"]
    INTERACT["Forums & Messaging"]
    CERTS["Certificates & Badges"]
  end

  API --> COURSES
  API --> LEARN
  API --> INTERACT
  API --> CERTS

  DB["MariaDB"]
  CACHE["Redis"]

  COURSES --> DB
  LEARN --> DB
  INTERACT --> DB
  CERTS --> DB

  API --> CACHE

Challenges & Solutions

#1Keeping creator workflows simple

The Problem

Course creators need easy upload/publish flows without complex settings.

The Fix

Used Frappe workflows and permissions to guide content publishing with a clean admin experience.

#2Interaction and notifications

The Problem

Messaging and discussions often require async delivery and integration hooks.

The Fix

Designed interaction events to be webhook-ready and compatible with background processing for notifications.

Results & Impact

A backend foundation for a Ghana-focused learning platform that supports course publishing, learner interaction, and extensible credentialing features.

Before → After

Course publishing workflow

Manual sharingPlatform-managed catalog
Structured distribution

Learner interaction

Disconnected channelsForums + messaging primitives
Better engagement

Extensibility

Hard to expandModular domains
Faster iteration

Business Outcome

Tutors can publish and monetize courses more easily, while learners get a consistent experience with interaction and progress tracking.

Reflections

Would Do Differently

  • 01Add search and recommendations earlier (catalogs grow quickly)
  • 02Introduce object storage for media assets from day one

Key Takeaways

  • 01EdTech platforms succeed when creator tooling is frictionless
  • 02Clear domain boundaries make it easier to grow from MVP to a larger platform

Next Project

PNTSH

Backend Engineering

PNTSH

Thanks for Reading