learningequality / learningequality/ricecooker
Decompose IMS Content Packages (SCORM/IMSCP) into individual Kolibri resources
@rtibblesbot is already working on this.
Since Jul 24, 2026.
- 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
imscpcode 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:
- Native media node (video/audio/pdf/image) — a single media file in a wrapper.
- KPUB — static article/document HTML.
- HTML5 zip served via zipcontent — genuinely interactive content.
- 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
imscpcode 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
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.