An open standard for packaging educational courses
Edpak is a ZIP-based open standard for packaging educational courses and learning materials. It provides a consistent, portable format for distributing course content across different platforms and learning management systems.
An edpak file is a standard ZIP archive with a .edpak file extension.
manifest.json file in the root directory.
The manifest.json file must be valid JSON and contain the following fields:
| Field | Type | Required | Description |
|---|---|---|---|
title |
string | Yes | The title of the course |
version |
string | Yes | Version number (semver recommended) |
author |
string | Yes | Name of the course author or organization |
description |
string | No | A brief description of the course content |
language |
string | No | ISO 639-1 language code (e.g., "en", "es") |
modules |
array | Yes | Array of module objects (see below) |
Each module object in the modules array must contain:
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | Unique identifier for the module |
title |
string | Yes | Title of the module |
content |
string | No | Path to an optional pre-rendered module content file (relative to package root) |
order |
number | No | Order in which the module should be presented |
{
"title": "Introduction to Python Programming",
"version": "1.0.0",
"author": "Jane Doe",
"description": "A comprehensive introduction to Python programming for beginners",
"language": "en",
"modules": [
{
"id": "module-1",
"title": "Getting Started with Python",
"content": "modules/01-getting-started.html",
"order": 1
},
{
"id": "module-2",
"title": "Variables and Data Types",
"content": "modules/02-variables.html",
"order": 2
}
]
}
Content files referenced in the manifest can be in various formats:
The core standard only requires a valid manifest.json, but the reference implementation follows this layout:
course.edpak (ZIP file)
├── manifest.json # REQUIRED
├── README.txt # OPTIONAL human-readable summary
├── images/ # Image assets (e.g., JPEG, PNG)
│ └── <FileName>
├── videos/ # Video assets
│ └── <FileName>
└── files/ # Other asset types
└── <FileName>
All paths referenced in modules[*].content and in any embedded HTML must resolve to files that exist in the archive.
Edpak v1.0 keeps the core manifest intentionally small. Implementations may add additional top-level fields to manifest.json to preserve richer course structures. The reference implementation uses the following optional extensions:
lessons (optional)An array describing lesson-level structure within modules.
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | Unique identifier for the lesson (e.g. "lesson-123") |
moduleId |
string | Yes | ID of the module this lesson belongs to (e.g. "module-1") |
title |
string | Yes | Lesson title |
type |
string | Yes | Lesson type (e.g. "Html", "Text", "Image", "Video", "MultipleChoice") |
status |
string | No | Status value from the source system (e.g. "Active") |
order |
number | No | Order of the lesson within its module |
description |
string | No | Lesson description |
content |
string | No | Raw lesson content from the source system (HTML, text, GUID, etc.) |
fileId |
string | No | Identifier of an associated binary file, if any |
filePath |
string | No | Resolved file path inside the archive (e.g. "images/slide1.jpg") |
files (optional)An array describing binary assets included in the package.
| Field | Type | Required | Description |
|---|---|---|---|
id |
string | Yes | Source-system file identifier |
fileName |
string | Yes | Original file name |
contentType |
string | Yes | MIME content type (e.g. "image/jpeg") |
size |
number | No | File size in bytes |
path |
string | Yes | Relative path of the file inside the archive |
missingFiles (optional)An array of human-readable strings describing any files that were referenced in the source system but could not be resolved or downloaded into the package.
x_source_platform (optional)An object carrying source-system metadata, for example:
courseIdcourseStatusexportedByexportedDatemoduleCount, lessonCount, fileCountx_source_author (optional)An object documenting how the author field was derived, for example:
value: the effective author stringfrom: a short description such as "ExportedBy"x_spec_notes (optional)An array of strings capturing free-form notes about how the package maps richer platform concepts into the current Edpak core schema. For example, a producer might note that multiple-choice quizzes are represented as lessons plus HTML content, since v1.0 has no dedicated quiz model.
All of these extension fields are OPTIONAL. Consumers that only understand the core Edpak v1.0 fields can safely ignore them, while more advanced tools can use them to reconstruct a richer course model.
A Python verification tool is provided to check if an edpak file is compliant with this standard.
pip install edpak-validator
# From command line
edpak-verify course.edpak
# From Python
from edpak_validator import verify_edpak
is_valid, errors = verify_edpak('course.edpak')
if is_valid:
print("Valid edpak file!")
else:
print("Invalid:", errors)
To be considered a valid edpak file, the package must:
.edpak file extensionmanifest.json file in the root directory