EdTech · LMS Ecosystem

MDBriefcase

A Flutter LMS ecosystem where one codebase powers seven apps across three medical-education businesses, with Moodle-backed SCORM learning that feels native on Android and iOS.

Client / Market

MDBriefcase (via Sazim Tech)

Remote · Production LMS

Role & Scope

Software Engineer · Full-lifecycle Flutter delivery

Sazim Tech · Jul 2025 to Present

Target Platforms
iOSAndroidMDBCRXBCBMA

Cross-Platform Flutter Engine

Production Store Links

Private / enterprise distribution

MDBriefcase LMS System banner with Flutter app home screen

One Flutter codebase · 7 apps · 3 businesses · Moodle + WordPress backends

7 AppsShared Codebase

MDBC, RXBC, and BMA brands from one Flutter engine

SCORMIn Flutter

JS↔Dart bridge so Moodle packages run like native web

2+3Backend Mesh

Two Moodle LMS systems and three WordPress CMS instances

CMELearning Loop

Preview → enroll → SCORM → quizzes → progress → credits

Executive Summary

MDBriefcase is a continuing medical education platform for physicians and allied professionals. Learners explore accredited courses, take SCORM-packaged modules published from Moodle, complete surveys and assessments, track progress toward credits, and manage engagement across events and related content, all inside branded Flutter apps.

The hardest engineering problem was not “another LMS UI.” SCORM packages are built for JavaScript runtimes on the web. Flutter is Dart. Moodle publishes course content as SCORM packages that expect a browser-style API surface. I built the bridge layer (WebView plus JavaScript channels with an explicit Dart API) so those packages get the same entry points they would on web, while course progress, quiz scores, and completion sync back into Moodle and the app’s progress UI on Android and iOS without failure.

Around that core, the same codebase delivers course explore/preview, enrollment, curriculum management, surveys, PDF and mixed content types, per-device SCORM download/storage controls, and analytics integrations including Salesforce-linked analytics and profile-related management.

The Challenge

The Challenge: Running Web-Native SCORM Inside a Dart Mobile Runtime

Few mobile engineers ever have to make Moodle SCORM packages behave correctly inside Flutter. The packages assume a JavaScript host. Without a faithful API layer, playback, completion tracking, and progress reporting break, and CME learners lose trust in credits and completion status.

01

SCORM Expects JavaScript; Flutter Speaks Dart

Moodle publishes SCORM form packages designed for browser JS. On mobile, those packages need the same channel surface a web host would provide (created manually in Flutter via JS↔Dart bridges), or the learning experience diverges from web.

02

Progress Must Match Moodle Truth

Track completion, quiz attempts, scores, and overall course progress had to round-trip through the bridge into Moodle completion state, then surface as accurate progress bars and status across the app.

03

Multi-Brand, Multi-Backend Complexity

One codebase powers seven apps across three businesses, talking to multiple Moodle LMS instances and WordPress CMS backends, without forking the learning engine per brand.

04

SCORM Downloads & Device Storage

Packages must download once per device, remain available offline for that install, reset if the user changes devices, and let learners manage how much storage they keep or clean up.

Project Scope

Engineering Objectives & Delivery Scope

  • Integrate Moodle-published SCORM packages in Flutter via WebView and JavaScript channels with a hand-built API layer matching web entry points.
  • Sync module completion, quiz scores, and course progress with Moodle and render trustworthy progress UI on Android and iOS.
  • Support course preview, explore, enrollment, curriculum taking, and mixed content (SCORM, surveys, PDFs, and related materials).
  • Ship events and survey management within the same product surface.
  • Implement per-device SCORM download caching with shared download state and user-controlled storage cleanup.
  • Maintain one Flutter codebase across seven branded apps (MDBC / RXBC / BMA) against multiple Moodle and WordPress backends.
  • Integrate Salesforce-linked analytics and profile-related management for engagement visibility.

Engineering Foundation

Architecture & Technical Design

Feature-based GetX architecture with repositories, typed DTOs, and domain entities. The SCORM runtime sits behind a unified interface with platform-specific WebView/JS bridge implementations for Android and iOS, talking to Moodle APIs for enrollment, tracking, and completion.

JS↔Dart SCORM Bridge

Manually implemented the API functions SCORM packages expect from a web host, exposed through JavaScript channels so Moodle form entry points connect cleanly into Flutter.

SCORMWebViewJavaScript ChannelsMoodle

Unified Interface, Dual Native Hosts

Separate Android and iOS WebView bridge implementations behind one Dart interface: same learner UX, platform-correct hosting.

AndroidiOSAbstraction

Progress & Completion Pipeline

Track-level events (module complete, quiz score, survey view) flow through the bridge into Moodle completion records and back into app progress bars and status chips.

CompletionQuizzesProgress UI

Multi-Backend Feature Modules

Repositories target Moodle LMS and WordPress CMS instances per brand configuration, keeping enrollment, content, events, and surveys modular.

Clean ArchitectureGetXRepositoriesCI/CD

One Flutter codebase

Feature-based · GetX

MDBC

RXBC

BMA

3× WordPress

CMS

2× Moodle

SCORM · JS↔Dart

One Flutter codebase becomes seven branded LMS apps.

Deep Dive

Key Technical Implementations

Detailed breakdown of core features addressing complex mobile engineering requirements.

Core Challenge

SCORM in Flutter via JavaScript Channels

The rare Dart↔JS host problem most mobile engineers never face

SCORM is a JavaScript-era standard. Moodle publishes packages that expect browser-style APIs. I built the missing host: WebView plus JavaScript channels and a hand-authored API layer so form entry points connect the way they would on web. Android and iOS each have correct native bridge implementations behind one Dart interface, and clients got on-spot views on both platforms without failure.

  • Manual API surface matching what a web SCORM host would expose automatically
  • Moodle form packages launch and communicate through JS channels into Dart
  • Parity-focused playback so Android and iOS match the intended web learning experience
Core Challenge
SCORM in Flutter via JavaScript Channels
Learning Integrity

Moodle Completion & Progress Tracking

Tracks, quizzes, scores, and completion status learners can trust

The same bridge powers progress. We record which tracks the learner completed, quiz attempts and scores, and Moodle completion status, then surface that as progress bars and status throughout enrolled courses and course detail screens.

  • Per-track completion events synced with Moodle
  • Quiz and assessment scores stored and reflected in course status
  • Progress percentages and bars driven by real completion data, not UI guesses
Learning Integrity
Moodle Completion & Progress Tracking
Device Cache

Per-Device SCORM Download & Storage Control

Download once on a device; reset when the device changes

SCORM packages download for a single device install. Shared download state avoids repeat fetches on that device. If the learner switches devices, setup resets. Users can see storage impact and clean up packages they no longer need.

  • One-time download per device with shared downloaded state
  • Device change resets local SCORM setup as designed
  • Learner-controlled storage cleanup for downloaded packages
Device Cache
Per-Device SCORM Download & Storage Control
Product Surface

Course Preview, Explore & Curriculum

From discovery to Take This Course to module-level work

Learners browse and preview CME/CPD programs (credits, duration, accreditation), enroll, then work through curriculum items (SCORM modules, pre-tests, surveys, and related activities) with clear “how to complete” guidance.

  • Course explore and preview with CME metadata
  • Curriculum lists mixing SCORM, surveys, and assessments
  • Enrollment and take-course CTAs wired into the Moodle-backed flow
Product Surface
Course Preview, Explore & Curriculum
Content Types

Surveys, PDFs & Mixed Course Content

Not only SCORM: full course content scope inside Flutter

Beyond packages, the apps integrate survey forms, PDF content, and other course-related materials so a single curriculum can mix interactive SCORM with supporting documents and feedback instruments.

  • Survey forms as first-class curriculum activities
  • PDF and supporting course materials in-scope
  • Consistent completion rules across content kinds
Engagement

Events & Survey Management

Engagement beyond the individual course player

The product surface also covers events and survey management so CME programs can run live/scheduled engagement alongside self-paced SCORM learning, within the same Flutter ecosystem.

  • Events as part of the learner journey
  • Survey management alongside course taking
  • Shared architecture with enrollment and progress modules
Ecosystem

Seven Apps, Three Businesses, Multi-Backend

One Flutter engine across MDBC, RXBC, and BMA

A single codebase powers seven production apps across three businesses, integrating multiple Moodle LMS systems and WordPress CMS instances. Feature-based GetX modules with repositories and typed DTOs keep brand and backend differences configurable instead of forked.

  • 7 apps / 3 businesses from one Flutter codebase
  • 2 Moodle LMS + 3 WordPress CMS integrations
  • GetX feature modules with repositories, DTOs, and domain entities
Ecosystem
Seven Apps, Three Businesses, Multi-Backend
Analytics

Salesforce Analytics & Profile Management

Engagement visibility and learner profile surfaces

Salesforce was integrated for the analytics side of engagement, alongside Google Analytics instrumentation and profile-related management so learning activity and learner identity stay connected for the business.

  • Salesforce-linked analytics for engagement insight
  • Google Analytics instrumentation in the mobile clients
  • Profile-related management within the LMS apps

Hurdles & Solutions

Technical Challenges & Trade-Offs

Real production obstacles overcome during engineering and deployment.

Challenge

Hosting SCORM (JS) packages inside Flutter (Dart) without breaking Moodle contracts

Engineered Solution

Built a WebView + JavaScript-channel host with an explicit Dart API layer that recreates the entry points a browser would provide, with separate Android/iOS implementations behind one interface.

Measurable Impact

Learners get web-parity SCORM experiences on both stores; clients validated views as on-spot without platform failure.

Challenge

Keeping progress, quizzes, and completion truthful across bridge and Moodle

Engineered Solution

Routed track completion and assessment events through the same bridge into Moodle completion APIs, then rebound results into progress UI.

Measurable Impact

Progress bars and status chips reflect real completion, which is critical for CME credit trust.

Challenge

SCORM package size vs. repeat downloads on mobile

Engineered Solution

Per-device download cache with shared downloaded state, reset on device change, and user-facing storage cleanup.

Measurable Impact

Packages download once per install; learners control storage without ops intervention.

Challenge

One codebase across seven branded apps and multiple backends

Engineered Solution

Feature-based GetX architecture with repositories targeting Moodle/WordPress per brand configuration instead of app forks.

Measurable Impact

Shared learning engine improvements land across MDBC, RXBC, and BMA together.

Outcomes

Impact & Production Outcomes

MDBriefcase proves a hard systems problem: make JavaScript-era SCORM feel native in Flutter while staying honest to Moodle. The bridge, progress pipeline, download cache, and multi-brand architecture turned that constraint into a production CME ecosystem clients were genuinely happy with, and we will layer in additional screenshots for events, surveys, storage management, and analytics as they become available.

7Apps on One Engine

Shared Flutter delivery across three medical-education businesses

JS↔DartSCORM Host

Moodle packages run with web-like API entry points inside Flutter

iOS+AndroidParity

Client-validated on-spot views without platform-specific failure

CMETrusted Progress

Completion, quizzes, and progress bars tied to Moodle truth

Technology Breakdown

Tools, Frameworks & Libraries

Categorized technical stack employed to achieve reliability, performance, and store compliance.

Core Framework & Architecture

FlutterDartClean ArchitectureGetXFeature ModulesRepositories / DTOs / Entities

LMS & Content

Moodle LMSSCORM PackagesWebViewJavaScript ChannelsWordPress CMS

Learning Features

Course Explore / PreviewEnrollmentProgress TrackingSurveysEventsPDF Content

Device & Storage

SCORM Download CachePer-Device StateStorage Cleanup Controls

Analytics & Engagement

Salesforce IntegrationGoogle AnalyticsProfile Management

Delivery

FirebaseCI/CDAndroid & iOS Production Builds