@xapi/cmi5
A typed JavaScript client that handles the cmi5 handshake for you inside a course
The facts
- Licence
- MIT — OSI approved
- Pricing
- Open source
- Deployment
- Embedded in your own application
- Platforms
- Library · Web
- Vendor
- xAPI.js
- Source code
- github.com/xapijs/cmi5 — opens in a new tab
Standards support
Every line says where the claim came from. We do not test conformance ourselves and we issue no badge of our own.
| Standard | Supported | Provenance | Checked | Note |
|---|---|---|---|---|
| SCORM 1.2 | No | editor-checked · 24 Aug 2026 | — | |
| SCORM 2004 | No | editor-checked · 24 Aug 2026 | — | |
| xAPI | Yes | editor-checked · 24 Aug 2026— source, opens in a new tab | Statements are sent through @xapi/xapi, the same project's xAPI client. Statement shaping is cmi5-specific; arbitrary xAPI is possible via the allowed extension points. | |
| cmi5 | Yes | editor-checked · 24 Aug 2026— source, opens in a new tab | Implements the AU side of the cmi5 handshake: it reads the launch parameters from the URL, POSTs the fetch URL for an auth token, and emits the defined statements — Initialized, Terminated, Passed, Failed, Completed, Waived — with the required context activities and extensions. The readme states compliance with the cmi5 Quartz 1st Edition specification; the statement and verb constants match it. | |
| AICC | Not stated | — | — | — |
| LTI | Not stated | — | — | — |
- Claimed
- — the vendor states it. We have not confirmed it.
- Checked
- — an editor confirmed it on the date shown.
- Verified
- — an official registry lists it, and we link to the entry.
Editor's notes
cmi5's difficulty is not the statements, it is the launch. An assignable unit is handed a set of URL parameters, has to exchange a fetch URL for an auth token, and must then send a specific sequence of statements with specific context activities and extensions or the LMS will not record the session correctly. @xapi/cmi5 does that for you: construct the class, call initialize(), and issue pass(), complete() or waive() at the right moments.
It is aimed at developers building custom or bespoke content — a JavaScript simulation, a React app, a game — that needs to run as a cmi5 AU. Strongly typed throughout, with interfaces for launch parameters, move-on conditions and performance criteria, so the compiler catches the shape errors that would otherwise appear as an LMS silently not registering completion. Four runtime dependencies, and a companion demo repository.
It will not help you author a package, validate cmi5.xml, or test without an LMS, and it does nothing for SCORM. If your content also has to run on a SCORM-only platform you will be maintaining two integration paths regardless.
Maintenance is the caveat worth sizing correctly. Twenty-three stars, five open issues, last release October 2024, last substantive commit before that. For a specification that has been stable since 2016 this is closer to "finished" than "abandoned", and the code is small enough to read in an afternoon and fork if needed. But if you need a fix, plan on making it yourself.
Listed on scorm-tools.com
Maintainers and vendors are welcome to show the listing badge in a README or on a product page. It is free, it does not require a claim, and there is nothing to buy.
Get the embed code