SCORM Course Engine: One Codebase for Every LMS Course
Our own SCORM 1.2 engine. Video lessons, scored assessments and resume, all set from one config file. Each build comes out as an LMS package and a browser version that runs with nothing to install. It already runs a pharma training programme.
Services
Results
The Challenge
SCORM is the standard that corporate learning platforms speak: Moodle, Cornerstone, Blackboard, SCORM Cloud. Most teams build courses with authoring tools and get slides, not an app. Few write SCORM in code, because the standard is old and every LMS reads it a little differently.
We wanted to be one of the few who do it well. One engine we own end to end, where a new course is content work, not a software project.
What We Built
An Angular app that runs as a single SCORM 1.2 unit. Lessons, groups, the assessment, the pass mark and the number of attempts all live in one config file. Add the videos, write the config, build.

What the Config Controls
- Lessons in order, with related lessons grouped under one heading.
- How much of a video counts as watched. The default is 90%.
- Whether the learner can skip past the furthest point they reached.
- A multiple-choice assessment with a pass mark, a set number of attempts, and optional shuffling of questions and answers.
- A scored course with pass and fail, or a completion-only course where watching is enough.

One Build, Two Versions
Every build comes out two ways: a zip that goes into the LMS as it is, and a folder a reviewer opens in any browser. The engine works out where it is running. Inside an LMS it saves progress and scores through the SCORM API. Outside one, it saves to the browser. Everything else behaves the same.
A Launcher With Nothing to Install
The package carries a launcher for Mac and one for Windows. Double-click, and the course opens on the reader’s own machine. The launcher looks for whatever the machine already has and uses it: Node, then Python, then Perl on a Mac, and Node, then Python, then PowerShell on Windows. The last option on each ships with the operating system, so there is always one.
We wrote a small server for each of those runtimes. Python’s built-in server ignores range requests, so a video shows 0:00 and won’t seek. Ours stream video in chunks, so a 280 MB lesson never sits in memory, and they can’t read outside the package folder.
The Details That Matter
LMS platforms disagree on small things. Some return an empty value on first launch instead of “ab-initio”. Some drop the session without warning. Some change the course status on their own the moment a score is set. The engine is built around these known quirks in Moodle, SCORM Cloud, Blackboard and Cornerstone, and it keeps the learner’s whole state in compact JSON under SCORM 1.2’s 4096-character limit.
Video straight out of the edit can be too heavy for a corporate network. The engine’s encoding step caps the bitrate and moves the file’s index to the front, so playback starts at once. Each lesson’s cover frame is pulled from its own video.
And it isn’t a demo. It runs BMS iLearn for Bristol Myers Squibb today, four modules so far, and every new module we added was content only.
What We Can Build on It for You
Product training for sales reps. Continuing medical education for doctors. Onboarding. Compliance training. Any video course that ends in an assessment and needs tracking in your LMS, with a review copy for your team before it goes live.