|
| 1 | +--- |
| 2 | +title: Add a SCORM package to a course |
| 3 | +description: Add a SCORM package to a course |
| 4 | +layout: ../../../layouts/MainLayout.astro |
| 5 | +--- |
| 6 | + |
| 7 | +You can add SCORM packages to your courses in CourseLit. This allows you to import interactive e-learning content created with tools like Articulate Storyline, Rise, Adobe Captivate, iSpring, and more. |
| 8 | + |
| 9 | +> The feature is currently in alpha, which means you may encounter bugs. Please report them in our <a href="https://discord.com/invite/GR4bQsN" target="_blank">Discord</a> group if you run into any. |
| 10 | +
|
| 11 | +## What is SCORM? |
| 12 | + |
| 13 | +SCORM (Sharable Content Object Reference Model) is an industry standard for e-learning content. It allows content created in one tool to be used in any SCORM-compliant LMS. |
| 14 | + |
| 15 | +CourseLit supports both **SCORM 1.2** and **SCORM 2004** packages. |
| 16 | + |
| 17 | +## Add a SCORM lesson |
| 18 | + |
| 19 | +1. Go to the `Products` page and click on the course you want to add SCORM content to. Click on `Edit content`. |
| 20 | + |
| 21 | +2. Click on `Add lesson` in any section. |
| 22 | + |
| 23 | +3. On the New Lesson screen, you'll see a row of lesson type cards. Click on the `SCORM` card to select it. |
| 24 | + |
| 25 | +4. Enter a title for your lesson and hit `Save`. |
| 26 | + |
| 27 | + |
| 28 | + |
| 29 | + > **Note:** SCORM lessons cannot be previewed. The `Preview` switch will have no effect. |
| 30 | + |
| 31 | +5. A SCORM upload area will appear. Click `Choose File` and select your SCORM package (ZIP file). The maximum file size is **300MB**. |
| 32 | + |
| 33 | + |
| 34 | + |
| 35 | +6. Wait for the upload to complete. CourseLit will automatically validate the package and extract the course structure. |
| 36 | + |
| 37 | + |
| 38 | + |
| 39 | +## Replacing a SCORM package |
| 40 | + |
| 41 | +To update an existing SCORM lesson with a new version of the package: |
| 42 | + |
| 43 | +1. Open the SCORM lesson for editing |
| 44 | +2. Click the `Replace` button |
| 45 | +3. Select the new ZIP file |
| 46 | +4. Wait for the upload to complete |
| 47 | + |
| 48 | +## Supported SCORM features |
| 49 | + |
| 50 | +| Feature | SCORM 1.2 | SCORM 2004 | |
| 51 | +| --------------------- | --------- | ---------- | |
| 52 | +| Progress tracking | ✅ | ✅ | |
| 53 | +| Completion status | ✅ | ✅ | |
| 54 | +| Resume (suspend data) | ✅ | ✅ | |
| 55 | +| Session time | ✅ | ✅ | |
| 56 | +| Score reporting | ✅ | ✅ | |
| 57 | + |
| 58 | +## How course completion is calculated |
| 59 | + |
| 60 | +CourseLit uses the data reported by the SCORM package to determine completion. When a learner clicks **Complete and Continue**, CourseLit checks the SCORM status stored in the database. |
| 61 | + |
| 62 | +A lesson is considered complete if **ANY** of the following conditions are met: |
| 63 | + |
| 64 | +1. **Explicit Completion:** The package reports a status of `completed` or `passed`. |
| 65 | + |
| 66 | + - For SCORM 1.2: `cmi.core.lesson_status` is `completed` or `passed`. |
| 67 | + - For SCORM 2004: `cmi.completion_status` is `completed` or `cmi.success_status` is `passed`. |
| 68 | + |
| 69 | +2. **Participation Fallback:** If the package does not report a completion status, CourseLit checks for evidence of participation. The lesson will be marked as complete if any of the following fields are present: |
| 70 | + - `cmi.suspend_data` (User made progress) |
| 71 | + - `cmi.core.session_time` (Time spent is recorded) |
| 72 | + - `cmi.core.exit` (Clean exit occurred) |
| 73 | + |
| 74 | +> **Note:** If none of these conditions are met, the learner will see an error message asking them to complete the content first. |
| 75 | +
|
| 76 | +## Learner experience |
| 77 | + |
| 78 | +When a learner opens a SCORM lesson: |
| 79 | + |
| 80 | +1. An **Enter** button is displayed |
| 81 | + |
| 82 | + |
| 83 | + |
| 84 | +2. Clicking the button opens the SCORM content in a popup window |
| 85 | + |
| 86 | + |
| 87 | + |
| 88 | +3. Progress is automatically saved as the learner interacts with the content |
| 89 | +4. When the learner closes the popup and returns, they can click **Complete and Continue** to proceed |
| 90 | + |
| 91 | +> **Note:** Progress is preserved even if the browser is closed unexpectedly. When the learner returns, they will resume from where they left off. |
| 92 | +
|
| 93 | +## Technical notes |
| 94 | + |
| 95 | +### For self-hosted setups |
| 96 | + |
| 97 | +#### Enabling SCORM |
| 98 | + |
| 99 | +SCORM requires disk-based caching to be enabled. Set the `CACHE_DIR` environment variable to enable SCORM support: |
| 100 | + |
| 101 | +| Variable | Description | Required | |
| 102 | +| -------------------------- | ------------------------------------------------------- | ------------------- | |
| 103 | +| `CACHE_DIR` | Directory path for cache (SCORM uses `CACHE_DIR/scorm`) | **Yes** | |
| 104 | +| `SCORM_PACKAGE_SIZE_LIMIT` | Maximum upload size for SCORM packages (in bytes) | No (default: 300MB) | |
| 105 | + |
| 106 | +> **Note:** If `CACHE_DIR` is not set, SCORM uploads will be disabled and the SCORM lesson type will appear grayed out in the lesson creator. |
| 107 | +
|
| 108 | +#### Docker Compose Example |
| 109 | + |
| 110 | +```yaml |
| 111 | +services: |
| 112 | + web: |
| 113 | + image: your-app |
| 114 | + deploy: |
| 115 | + replicas: 3 |
| 116 | + volumes: |
| 117 | + - cache-data:/app/cache |
| 118 | + environment: |
| 119 | + - CACHE_DIR=/app/cache |
| 120 | + |
| 121 | +volumes: |
| 122 | + cache-data: |
| 123 | +``` |
| 124 | +
|
| 125 | +#### Serverless environments |
| 126 | +
|
| 127 | +For serverless environments (Vercel, AWS Lambda), you can use `/tmp` as the cache directory: |
| 128 | + |
| 129 | +``` |
| 130 | +CACHE_DIR=/tmp |
| 131 | +``` |
| 132 | +
|
| 133 | +Note that `/tmp` is ephemeral in serverless - extracted files will be re-extracted on cold starts, but this still works correctly. |
| 134 | +
|
| 135 | +## Stuck somewhere? |
| 136 | +
|
| 137 | +We are always here for you. Come chat with us in our <a href="https://discord.com/invite/GR4bQsN" target="_blank">Discord</a> channel or send a tweet at <a href="https://twitter.com/courselit" target="_blank">@CourseLit</a>. |
0 commit comments