What is inside a SCORM file?
A SCORM viewer is any tool that opens a SCORM package and runs the course inside it. A SCORM file is an ordinary zip, so once it is unzipped a browser can display its pages. Tracking is different: it only works in a viewer that supplies the SCORM API, which means an LMS or a SCORM test player.
That distinction decides which method you need. If you only want to see what a course contains, you need nothing more than an unzip tool and a browser. If you want to see what it will report, you need something that plays the part of the LMS.
Unzip the package into its own folder and you will find:
- imsmanifest.xml at the root. This is the index. It lists the course structure and says which file starts each part.
- The content: HTML pages, scripts, stylesheets, images, audio and video, usually in subfolders.
- Schema files ending in .xsd or .dtd. They describe the manifest format and are not part of the course.
Extract the whole zip before opening anything. Double-clicking a page from inside the zip preview opens a temporary copy of that one file without its scripts and images, and the course will look broken when it is not. If the manifest is not at the root of the zip, the file is not a valid SCORM package, whatever else is in it.
Finding the launch page in the manifest
A package can hold hundreds of HTML files, and the one called index.html is not always the one that starts the course. The manifest tells you which is. Open imsmanifest.xml in a text editor and look for these two sections:
<organizations default="org-1">
<organization identifier="org-1">
<title>Fire safety</title>
<item identifier="item-1" identifierref="res-1">
<title>Module 1</title>
</item>
</organization>
</organizations>
<resources>
<resource identifier="res-1" type="webcontent"
adlcp:scormtype="sco" href="content/index.html">
<file href="content/index.html"/>
</resource>
</resources>
Follow the chain in four steps:
- Read the
defaultattribute on<organizations>. It names the organization the LMS uses. If the attribute is missing, use the first organization. - Inside that organization, find the first
<item>that has anidentifierref. Items without one are folders that only group other items. - Find the
<resource>whoseidentifiermatches thatidentifierref. - Read its
href. That is the launch page, as a path relative to the folder the manifest is in.
In the example the launch page is content/index.html. Two details can change the path. An xml:base attribute on the resource or on <resources> is a folder prefix that goes in front of the href. A parameters attribute on the item is a query string the LMS adds to the end of the URL, and some courses will not start on the right page without it.
If the organization has several items that each point to a resource, the package has several launch pages, one per SCO, and an LMS would show them as a menu. Every other element of the file is covered in imsmanifest.xml explained.
Opening it in a browser
Double-click the launch page and it opens in your default browser from a file:// address. For a simple course that is enough to read the text, click through the pages and check the media.
Many courses will show a blank page or a spinner that never ends instead. Browsers restrict what a page opened from disk is allowed to load by script, and courses that fetch their slides or settings from separate data files run into that restriction. Nothing is wrong with the package. It was built to be served by a web server, and it needs one.
The fix is to serve the unzipped folder from a local web server. If Python is installed, open a terminal in the folder that holds the manifest and run:
python -m http.server 8000
Then open http://localhost:8000/content/index.html in the browser, using the launch path you found in the manifest. Any static web server does the same job. The content now loads the way it would from an LMS, with one large exception.
Why tracking does not work that way
A SCORM course does not store anything itself. When it starts, its JavaScript goes looking for an object the LMS is supposed to have placed in a surrounding window: API for SCORM 1.2, or API_1484_11 for SCORM 2004. It checks its parent window, then that window's parent, and then the window that opened it. Every score, bookmark and completion goes through that object.
Opened on its own in a browser tab, the course has no parent window and no opener, so the search finds nothing. What happens next depends on how the course was written:
- It shows an error saying the API or the LMS could not be found.
- It stops at the first page, or will not move on, because it is waiting for a reply that never comes.
- It plays normally and records nothing. This is the most misleading case, because everything looks fine.
In all three cases there is no resume either. The bookmark is one of the values the course hands to the LMS, so with no LMS every visit starts from the beginning.
Using a SCORM viewer to see tracking
To see the course behave as it will for learners, it has to run inside something that provides the API and keeps what the course sends. There are three practical routes.
- The destination LMS. Upload the zip to a test course and launch it as a learner. This is the only route that shows that platform's real behaviour.
- A SCORM test player. A tool that implements the API, launches the package and lists each call the course makes. It is the quickest way to find out what a package reports.
- A stub page of your own. A few lines of JavaScript are enough to give the course an API to find.
For a SCORM 1.2 package, the stub looks like this:
window.API = {
LMSInitialize: function () { return "true"; },
LMSGetValue: function (k) { console.log("get", k); return ""; },
LMSSetValue: function (k, v) { console.log("set", k, v); return "true"; },
LMSCommit: function () { return "true"; },
LMSFinish: function () { return "true"; },
LMSGetLastError: function () { return "0"; },
LMSGetErrorString: function () { return ""; },
LMSGetDiagnostic: function () { return ""; }
};
Put it in a script on an HTML page, add an <iframe> below it that points at the launch page, and serve both from the same local server. The course finds API in its parent window, and every value it reads or writes appears in the browser console. A SCORM 2004 package needs the object to be named API_1484_11, with the function names that version uses: Initialize, GetValue, SetValue, Commit, Terminate and the three error functions.
A stub shows what the course sends. It does not show how an LMS answers. It returns an empty string for every read and remembers nothing, so resume cannot be tested with it, and a course that expects a real learner name or a saved bookmark may behave differently from the way it does in production. Use it to look at the content and its calls, then check the full list in how to test a SCORM package before upload against the real platform.
If the aim is to let other people take the course without an LMS, and not only to look at it yourself, the options are different and are set out in hosting SCORM without an LMS.
Where SCORM Central fits
SCORM Central turns PowerPoint, PDF, and video files into SCORM 1.2 or SCORM 2004 4th Edition packages you can edit in its course builder, and its free tester shows the manifest checks and every runtime call a package makes before an LMS sees it. See how it works, or test a package free.