learningequality / learningequality/ricecooker

Decompose IMS Content Packages (SCORM/IMSCP) into individual Kolibri resources

Open
#332 8 comments 1 reaction 1 assignee View on GitHub

@rtibblesbot is already working on this.

Since Jul 24, 2026.

P1 - important
Dominant language
Python
Stars
31
Forks
77
Avg merge
5d 4h
Merged PRs (30d)
3

Description

Overview

Migrate the imscp code into ricecooker.

Decompose an IMS Content Package (including SCORM) into individual Kolibri resources, driven by its manifest.

This reverses the original "no dependency zips" decision; shared-library dependency zips return as a follow-up.

Complexity: High
Target branch: main

Context

  • The imscp code lives in a separate repo (learningequality/imscp) and should be native to ricecooker.
  • IMSCP is the packaging layer under SCORM.
  • Its manifest (imsmanifest.xml) is the standardized, tool-independent structure.
  • One opaque webcontent zip backs many nodes, so Kolibri's per-resource import pulls the whole package when a single node is selected.
  • Wrapping plain media in an HTML5 sandbox strips native affordances — a video should play as a VideoNode, not a <video> in a sandbox.
  • The existing reference machinery locates and rewrites references only within a single archive.

The decomposition ladder

Per manifest resource, take the highest rung it safely qualifies for:

  1. Native media node (video/audio/pdf/image) — a single media file in a wrapper.
  2. KPUB — static article/document HTML.
  3. HTML5 zip served via zipcontent — genuinely interactive content.
  4. QTI assessment item — assessment content.

Classification runs on one axis: does the resource's meaning survive stripping its JS/CSS?

  • Discount SCORM API boilerplate (pipwerks, LMSInitialize, SetValue) before judging interactivity.
  • Bias conservative — promote only on high confidence.
  • Never promote a resource carrying assessment, score, or tracking semantics.

The crux

Decomposition must rewrite references across resources: a promoted node referenced by a sibling, or a shared library in a dependency zip.

The rewrite emits two new target forms:

  • native-node references
  • zipcontent-relative dependency paths

Deferred to follow-ups

  • Per-tool deep parsers (Storyline, Captivate, Rise, iSpring, Adapt content models).
  • Interactivity classification beyond the sanitization-survival test.
  • Automatic dependency-zip vendoring for shared HTML5 libraries.

Acceptance Criteria

  • An IMSCP/SCORM package imports natively, with the imscp code migrated into ricecooker.
  • The manifest drives the node/topic tree.
  • A single wrapped media file becomes a native media node.
  • A static-article resource becomes a KPUB.
  • An interactive resource becomes an HTML5 zip served via zipcontent.
  • A resource carrying assessment semantics is never promoted to media or KPUB.
  • References between decomposed resources resolve correctly in Kolibri.
  • Each decomposed node is backed by its own files, not one shared package zip.

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.