# Open Educational Experience Launcher

An Open Educational Experience Launcher is based on four open standards:

* [OPDS](https://opds.io/) __an open standard to describe collections of publications__: any edtech
  app developer can publish an OPDS feed listing the publications (e.g. lessons, assessments, etc)
  in their app. Other apps can enable teachers to make their own remixes.
* [xAPI](https://xapi.com/overview/) __an open standard to collect data about the user's experience__
  e.g. scores, answers to questions, usage duration etc. This data is sent to a Learner Record Store
  (LRS) such as one run by the users own school or institution. xAPI recipes can be used to save and
  retrieve data about classes, enrollments, and assignments.
* [Web Publication Manifest](https://readium.org/webpub-manifest/) __an open standard that provides
  metadata about publications__ including a listing of the URLs that would be required for a 
  publication e.g. so they can be cached for the publication to be used offline. The WebPub manifest
  can also provide links to cover images, versions of the publication in other languages, and more.
* [oAUTH](https://oauth.net/2/) __an open standard for authentication__: to allow users to
  authenticate.

Taken together these open standards make it possible to browse educational content from multiple apps, 
collect data about a users experience, and support offline functionality.

The launcher supports [app links](https://developer.android.com/training/app-links) to enable 
launching a publication in a native app instead of a WebView and 
[xAPI over interprocess communication](../respect-lib-xapi-ipc-shared/README.md) for
the native app to send xAPI data about the user's experience back to the launcher.

## Launching a publication using xAPI

There are two primary ways to launch xAPI (e.g. from a learning management system): the [Rustici](https://github.com/RusticiSoftware/launch/blob/master/lms_lrs.md) 
launch method (using a tincan.xml file) and CMI-5. The links section of the publication manifest can 
be used to provide a link to the tincan.xml.

Example links section for a web publication manifest:
```json
{
  "links": [
    {"rel": "self", "href": "lesson.json", "type": "application/opds-publication+json"},
    {
      "rel": "https://id.openeel.org/rel/tincanxml", 
      "href": "tincan.xml", 
      "type": "application/xml"
    }
  ]
}
```

When a link with xAPI support is provided (link rel ```https://id.openeel.org/rel/tincanxml```) 
the open educational launcher will launch the resource with support to collect data about the 
learner's experience using xAPI. A TinCan.xml contains the Experience API activity ID and a href
that can be used to launch the activity.

Example tincan.xml file:
```xml
<tincan xmlns="http://projecttincan.com/tincan.xsd">
    <activities>
        <activity id="https://demo.openeel.org/Lesson" type="http://activitystrea.ms/schema/1.0/game">
            <name>Lesson 1</name>
            <description lang="en-US">A demo lesson</description>
            <launch lang="en-us">lesson.html</launch>
        </activity>
    </activities>
</tincan>
```
When tincan.xml is used to launch a resource query parameters will be added as per the [Rustici Launch Method](https://github.com/RusticiSoftware/launch/blob/master/lms_lrs.md)
to provide the xAPI endpoint URL, authentication, actor, and activity enabling the resource to send
usage data back. TinCan.xml files are also commonly generated by eLearning authoring tools such as 
[Adobe Captivate](https://elearning.adobe.com/2025/05/how-to-use-xapi-in-adobe-captivate-for-smarter-learner-tracking/) and [Articulate Storyline](https://www.articulatesupport.com/article/Publishing-Articulate-Storyline-360-Courses-for-Tin-Can-API)/

__Note__: by nature it is expected that one publication manifest is related to one xAPI launchable 
activity (a web publication manifest has one set of metadata with one title, one identifier etc). 
A tincan.xml file can (but normally doesn't) contain multiple activities each with its own name, 
description, and url. In this case the activity id needs to be specified directly, otherwies it
is optional e.g.

```json
{
  "rel": "https://id.openeel.org/rel/tincanxml",
  "href": "tincan.xml",
  "type": "application/xml",
  "links": [
    {
      "rel": "https://id.openeel.org/rel/xapi-activity-id",
      "href": "https://example.app/id/lesson001"
    }
  ]
}
```

## Specifying a Readium Publication Manifest for a given xAPI Activity

Sometimes one might have an xAPI Activity ID and want to retrieve the publication manifest for that 
activity e.g. where an assignment has been assigned using the [assignment recipe](README_ASSIGNMENT_RECIPE.md).
This should be specified using the [Activity web publication manifest extension](README_EXTENSION_PUBLICATION.md).

The Activity [moreInfo property](https://github.com/adlnet/xAPI-Spec/blob/master/xAPI-Data.md#activity-definition)
URL could provide a link to the manifest using [Manifest Discovery](https://readium.org/webpub-manifest/#5-discovering-a-manifest).
This is not currently supported.
