> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mauvely.com/llms.txt
> Use this file to discover all available pages before exploring further.

# SCORM export

> What Compose puts in a SCORM package, what it reports to your LMS, how completion and score are calculated, and how to troubleshoot an import.

SCORM is the packaging and tracking standard most Learning Management Systems accept. Compose
exports **SCORM 2004 (3rd Edition)** and **SCORM 1.2**, both as a single `.zip`.

## Which version to choose

| Choose         | When                                                             |
| -------------- | ---------------------------------------------------------------- |
| **SCORM 2004** | Your LMS supports it. Roomier progress storage, and the default. |
| **SCORM 1.2**  | Your LMS is older, or rejects a 2004 package on import.          |

If you are not sure, try 2004 first. An LMS that cannot handle it usually says so plainly at
import.

## Exporting

<Steps>
  <Step title="Set the format">
    **Course ▸ Export format**, or pick it in the export dialog. The current format is shown in the
    status strip.
  </Step>

  <Step title="Export">
    **Course ▸ Export…** (`Ctrl` `E`), choose SCORM 2004 or SCORM 1.2, and pick where to save.
  </Step>

  <Step title="Check the warnings">
    Compose reports any media it could not find. Those files are missing from the package.
  </Step>

  <Step title="Upload the .zip to your LMS">
    Upload the zip itself — do not unzip it first, and do not re-zip its contents from one level up.
    The manifest must sit at the root of the archive.
  </Step>
</Steps>

## What is in the package

One **single-SCO** package: one organisation, one item, one resource. Every course, however many
lessons it has, is one trackable unit as far as the LMS is concerned — lesson navigation happens
inside the course rather than through the LMS's menu.

```
imsmanifest.xml     the manifest
index.html          the course
style.css
app.js              the course runtime
scorm.js            the LMS communication layer
assets/             images, video, audio, models, fonts, resources
```

<Note>
  The ADL XSD control files are deliberately not included. SCORM Cloud, Moodle and Blackboard all
  accept manifests without them. If a stricter LMS ever complains, the fix is to add those files
  beside `index.html`.
</Note>

## What gets reported to your LMS

### Completion

The course reports itself complete when **both** are true:

1. The learner has visited every lesson, and
2. Every block marked **Required** has been completed.

Only six block types can be required in a way that counts: Multiple choice, Fill in the blank,
Drag & drop, Matching, Hotspots and Branching. Marking anything else as required has no effect.

<Warning>
  A course with no required blocks completes as soon as the learner has visited every lesson. If
  your LMS needs to see genuine engagement, mark at least one activity per lesson as required.
</Warning>

### Score

If the course contains any Multiple choice, Fill in the blank, Drag & drop or Matching blocks, a
score is reported as a percentage: the proportion of them the learner got right **on their first
attempt**.

This is worth being explicit with learners about. All four block types let you retry until you are
right — retrying completes the block, but does not recover the mark. A course with no scoreable
blocks reports no score at all.

### Progress and resume

Progress is stored in the LMS's suspend data: which lesson the learner is on, which lessons they
have visited, which activities they have completed, and which were right first time. Closing the
course and reopening it later resumes where they left off.

<Note>
  **SCORM 1.2 limits suspend data to 4096 characters.** A very large course can exceed that. Rather
  than corrupting the saved state, Compose progressively drops the least important part — first the
  first-try record used for scoring, then the completion list — so resume keeps working. SCORM 2004
  has a much larger limit and does not hit this.
</Note>

## Outside an LMS

The same course opened without an LMS — from an HTML5 export, from disk, or from a web server —
falls back to the browser's local storage. Progress still persists across reloads for that
browser, but nothing is reported anywhere.

This is also what makes an HTML5 export a genuinely usable deliverable rather than a preview.

## Troubleshooting

<AccordionGroup>
  <Accordion title="The LMS rejects the package on import" icon="triangle-exclamation">
    Almost always one of:

    * The zip was unzipped and re-zipped, putting `imsmanifest.xml` one folder deep instead of at
      the root.
    * The LMS does not accept SCORM 2004 — export SCORM 1.2 instead.
    * The package exceeds the LMS's upload size limit. Compose embeds all media, so a video-heavy
      course produces a big file; host long video externally and link to it.
  </Accordion>

  <Accordion title="The course loads but nothing is tracked" icon="chart-line">
    The course could not find the LMS's API. This usually means the course is being served in a way
    that breaks the frame relationship the standard relies on — opened in a new tab detached from
    the player, for example. Launch it the way the LMS intends.

    Add `?debug=1` to the course URL to log every call the course makes to the LMS in the browser
    console.
  </Accordion>

  <Accordion title="Completion never fires" icon="circle-check">
    The learner has not visited every lesson, or a required activity is unfinished. Note that
    *visiting* a lesson means arriving on it — required activities are the only thing that gates
    the Next button.
  </Accordion>

  <Accordion title="The score is lower than the learner expects" icon="percent">
    Score is first-attempt only. A learner who worked through every question by retrying will show
    a low score and full completion. That is intended, but tell them beforehand.
  </Accordion>

  <Accordion title="Images or video are missing in the LMS but fine in the editor" icon="image">
    Check the warnings shown at the end of the export. A file that had moved on disk since you
    added it is dropped from the package and reported there.
  </Accordion>
</AccordionGroup>
