---
title: "Scorm Player Sheikhsulaiman"
description: "A static site that plays a SCORM 1.2 package and shows the run-time conversation while it happens. JSZip unpacks the archive in the browser, the files are written to the Cache API and served back through a service worker at a real same-origin path — which matters, because SCORM content uses relative asset paths and finds its LMS by walking window.parent for an object named API, and blob URLs break both."
canonical_url: "https://scorm-tools.com/tools/scorm-player-sheikhsulaiman"
last_updated: "2026-10-31T10:22:03.263Z"
---

A static site that plays a SCORM 1.2 package and shows the run-time conversation while it happens. JSZip unpacks the archive in the browser, the files are written to the Cache API and served back through a service worker at a real same-origin path — which matters, because SCORM content uses relative asset paths and finds its LMS by walking `window.parent` for an object named `API`, and blob URLs break both.

The implementation goes further than most demonstrations into the behaviour the specification assigns to the LMS rather than the content: `session_time` accumulating into `total_time`, `cmi.core.exit` producing the next attempt's `entry`, `adlcp:masteryscore` deriving pass or fail from a raw score, `maxtimeallowed` with its time-limit action, and AICC-script prerequisites. Each of those decisions is written into the call log as an explicit entry, so the player explains itself rather than behaving magically.

Two caveats decide whether it is for you. It is SCORM 1.2 only, by design. And it is brand new: two commits on a single day in July 2026, no stars, no external users, and its conformance figures come from a harness the author wrote and shipped in the same repository — plausible, and unverified by anyone else.

Read it as a well-argued reference implementation of the LMS side, and as a quick local harness for a 1.2 package. Do not yet depend on it.
